/* CSP-201803P2 碰撞的小球（模拟）
碰撞不改变球在轴上的顺序：比如第2个球无论怎么碰撞，总是处第1、第3个球中间。
但输入数据可能不按从左到右的顺序，所以对数据中的第i个球，要统计它左边球的个数来确定其初始顺序。
模拟时两球碰撞可按穿透处理、速度不变，这样只需判断到轴端点时反向。
到t时刻按最终位置从左到右排序，再按初始顺序输出坐标。

因球数和秒数都不超过100，所以模拟时再加一层循环判断碰撞也可行，复杂度是O(t * n^2)
——感谢陈云玲同学补充。
*/
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main(){
  int n, L, t;
  cin >> n >> L >> t; // 数量、数轴长度、模拟时长。
  vector<int> vpos(n); // 球的位置
  vector<int> vdir(n, 1); // 球的速度（向右为1，向左-1）
  vector<int> vseq(n); // 球的初始顺序，输入数据的第i个球是左起第vseq[i]个。
  for(int i = 0; i < n; ++i){
    cin >> vpos[i];
  }
  for(int i = 0; i < n; ++i){ // 依次统计球i左边有多少个球
    int left = 0;
    for(int j = 0; j < n; ++j){
      if(vpos[j] < vpos[i]){ // 球j在球i左边
        ++left;
      }
    }
    vseq[i] = left; // 球i从左起的序号
  }
  for(int i = 0; i < t; ++i){ // 模拟t秒
    for(int j = 0; j < n; ++j){
      vpos[j] += vdir[j];
      if(vpos[j] == 0){ // 碰到左端
        vdir[j] = 1;
      }else if(vpos[j] == L){ // 碰到右端
        vdir[j] = -1;
      }
    }
  }
  sort(vpos.begin(), vpos.end()); // 按最终位置排序
  for(int i = 0; i < n; ++i){ // 按输入数据的顺序输出各球位置
    cout << vpos[vseq[i]] << (i < n-1 ? ' ' : '\n');
  }
  cout << flush;
}
